package destiny.预测;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import destiny.干支局;

/**
 * 运 > 流年 > 四柱
 */
public class 成局 {
	/**
	 * 0 - 运柱; 1 - 流年柱
	 * 
	 * 2 - 年柱; 3 - 月柱; 4 - 日柱; 5 - 时柱
	 */

	private 干支局 局;
	private int id = 0;
	private Enum<?> enumInstance;
	private Map<Integer, 数> 数 = new HashMap<Integer, 数>();

	public 成局(干支局 局, Enum<?> enumInstance, int x, int y, int z, 数 s1, 数 s2, 数 s3) {
		this.局 = 局;
		this.enumInstance = enumInstance;

		id |= (1 << x);
		id |= (1 << y);
		id |= (1 << z);

		数.put(x, s1);
		数.put(y, s2);
		数.put(z, s3);
	}

	public 成局(干支局 局, Enum<?> enumInstance, int x, int y, 数 s1, 数 s2) {
		this.局 = 局;
		this.enumInstance = enumInstance;

		id |= (1 << x);
		id |= (1 << y);

		数.put(x, s1);
		数.put(y, s2);
	}

	public boolean matched(成局 x) {
		return 局.equals(x.局) && (id == x.id)
				&& enumInstance.equals(x.enumInstance);
	}

	int[] getIndexes() {
		List<Integer> l = new ArrayList<Integer>();
		int i = id, j = 0;
		while (i != 0) {
			if ((i & (1 << j)) > 0) {
				l.add(j);
				i &= ~(1 << j);
			}
			++j;
		}
		int[] ret = new int[l.size()];
		i = 0;
		for (int idx : l) {
			ret[i++] = idx;
		}
		return ret;
	}

	public 干支局 局() {
		return 局;
	}

	public int getId() {
		return id;
	}

	public Enum<?> getEnumInstance() {
		return enumInstance;
	}

	public Map<Integer, 数> 数() {
		return 数;
	}

	public boolean setOnIndex(int i) {
		for (int idx : getIndexes())
			if (i == idx)
				return true;

		return false;
	}
}
